const fs = require("fs");

// 引入自定义模块，用于执行命令行命令
const runCmd = require("./server/utils/runCmd");
// 引入自定义日志模块
const logger = require("./server/utils/logger");

const command = {
  win32: {
    cmd: "pm2.cmd",
    start: "start",
    stop: "stop",
    restart: "restart",
    delete: "delete",
  },
  pm2: {
    cmd: "pm2",
    start: "start",
    stop: "stop",
    restart: "restart",
    delete: "delete",
  },
};

const CMD = process.platform === "win32" ? command.win32 : command.pm2;
//const env = process.env.NODE_ENV || "development";

class MicroDeploy {
  constructor() {}

  // 定义一个异步方法 start，接收一个参数 args
  async start(args) {
    try {
      // 存储参数，用于多文件传参
      // 将传入的参数 args 序列化为 JSON 字符串，并写入到 args.json 文件中
      fs.writeFileSync("args.json", JSON.stringify(args));

      // 使用 runCmd 模块执行 pm2 命令，删除名为 micro-deploy 的服务
      runCmd(CMD.cmd, [CMD.delete, "micro-deploy"], () => {});

      // 等待 1 秒钟，确保服务已被删除，防止异步并行，sleep 1s
      await new Promise((resolve) => setTimeout(resolve, 1000));

      // 定义 pm2 启动服务的命令行参数, -n 设定服务名：micro-deploy
      const argv = [
        CMD.start,
        __dirname + "/server/index.js",
        "-n",
        "micro-deploy",
      ];

      console.log("检测到执行js脚本：", __dirname + "/server/index.js");

      // 使用 runCmd 模块执行 pm2 命令，启动服务，并将输出日志通过 logger 模块打印
      runCmd(CMD.cmd, argv, (text) => {
        logger.log("执行命令成功 =====>", text);
      });

      //通过命令 查询实时日志
      // if (env)
      //   runCmd(CMD.cmd, ["logs", "micro-deploy"], (text) => {
      //     logger.log("执行命令成功 =====>", text);
      //   });

      // 使用 node 命令直接启动服务
      //runCmd("node", [__dirname + "/server/index.js"], (text) => {
      //   logger.log(text);
      // });
    } catch (e) {
      console.log("执行异常：", e);
    }
  }
}

module.exports = MicroDeploy;
